import time
from fastapi import FastAPI, Depends, HTTPException
from fastapi.responses import JSONResponse
from data_models.models import QueryRequest

from utils.async_utils import run_in_thread_pool

# 导入统一的日志配置模块
from log_config import setup_logging
# 配置日志
setup_logging()
import logging
logger = logging.getLogger(__name__)

# 注册查询相关路由
def register_query_routes(app: FastAPI, get_embedding_service, get_thread_pool, get_config_service):
    """
    注册查询相关的API路由
    处理用户的查询请求并返回匹配的结果
    
    :param app: FastAPI应用实例
    :param get_embedding_service: 获取嵌入服务的依赖注入函数
    :param get_thread_pool: 获取线程池的依赖注入函数
    :param get_config_service: 获取配置服务的依赖注入函数
    """
    @app.post("/query")
    async def query_info(request: QueryRequest, 
                       embedding_service=Depends(get_embedding_service),
                       thread_pool=Depends(get_thread_pool),
                       config_service=Depends(get_config_service)):
        """
        处理查询请求，根据用户输入的查询文本和分类返回相关结果
        
        :param request: 查询请求对象，包含查询文本、分类、返回结果数量和是否重排序选项
        :param embedding_service: 通过依赖注入获取的嵌入服务实例
        :param thread_pool: 通过依赖注入获取的线程池实例
        :return: 包含操作状态和查询结果的JSON响应
        :raises HTTPException: 当参数无效或查询失败时抛出相应错误
        """
        try:
            # 添加category参数非空检查
            if not request.category or not request.category.strip():
                logger.warning("查询请求缺少分类信息")
                raise HTTPException(status_code=400, detail="分类名称不能为空")

            # 从配置文件中获取top_k参数
            top_k = config_service.getint('query', 'top_k', fallback=5)

            # 记录查询开始时间
            start_time = time.time()        
            
            # 使用线程池执行同步的查询操作，避免阻塞事件循环
            response = await run_in_thread_pool(
                thread_pool,
                embedding_service.query,
                request.category, request.query, top_k, request.rerank
            )        
            
            # 记录查询结束时间
            end_time = time.time()
            # 计算查询耗时
            query_elasped_time = end_time - start_time
            logger.info(f"在向量数据库中查询耗时: {query_elasped_time:.4f} 秒")

            if response['success']:
                logger.info(f'查询成功, 记录数量: {len(response["results"])} 条')

                return JSONResponse(content={
                        "success": True,
                        "results": response["results"]
                    }, status_code=200)
            else:
                logger.error(f"Embedding查询失败: {response['message']}")
                return JSONResponse(content={
                    "success": False,
                    "message": response['message']
                }, status_code=400)
        except Exception as err:
            logger.error(f"查询时出错: {str(err)}")
            raise HTTPException(status_code=500, detail=f"查询时出错: {str(err)}")